package com.cskaoyan.javase.object._1getclass;

/**
 * getClass方法
 * 1.方法头/方法的声明: public final native Class<?> getClass();
 *    final表示方法不能被重写
 *    native表示该方法是一个本地方法,借助其他语言实现,所以不需要方法体
 *    Class<?>是方法的返回值类型,表示该方法会返回一个java.lang.Class对象
 *      <?>这是泛型,泛型是在程序的编译时期提升代码灵活性的.这里我们不讲泛型,忽略它对程序的运行没有影响
 *
 *
 * 2.方法的作用: 返回,表示此对象运行时类的 Class 对象。
 * 什么是运行时类,什么是Class对象,Class类又是干嘛的?
 * 为了满足程序员的这种需求，于是，JVM在类加载某个类的同时，会在堆上会自动创建一个该类的运行时类对象，也就是这个类的Class对象。Class对象当中，包含了该类的所有类型信息（比如类名是啥，有哪些方法、变量、构造器等），于是程序员在程序的运行时期，只需要获取该类的Class对象，就能够获取类型信息了。
 *
 * 注意事项:
 *      1.getClass只是获取该Class对象,它不是创建.Class对象是JVM类加载时自己创建的.
 *      2.类加载只有一次,那么某个类型的Class对象也就只有一个,是唯一的
 *          不同的类型,它的Class对象必然不同,用"=="判断返回false
 *          相同的类型,它的Class对象必然是一个,用"=="判断返回true
 *
 *
 * @since 17:31
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Cat c = new Cat();
        Cat c2 = new Cat();
        Class catClazz = c.getClass();
        Class catClazz2 = c2.getClass();
        System.out.println(catClazz == catClazz2);

        Dog d = new Dog();
        Class dogClazz = d.getClass();
        System.out.println(dogClazz == catClazz);

        // 获取类的全限定类名
        // getName()
        //  获取类名
        // getSimpleName()
        System.out.println(dogClazz.getSimpleName());
        System.out.println(catClazz.getName());
    }
}

class Cat {
}

class Dog {
}